[참조]
- 공학자를 위한 Python, 조정래, 2022: 2.3 함수와 클래스
https://wikidocs.net/14596 - 점프투파이썬, 박응용, 2022: 05-1 클래스
https://wikidocs.net/28 - Dookie Kim, Python: From Beginning to Application, 2022 [PDF]
간단한 프로그램은 함수만으로 효율적인 절차지향(procedure-oriented) 프로그래밍을 작성할 수 있다.
하지만 프로그램이 커지면 객체의 틀(뼈대)인 클래스(class)를 사용한 객체지향(object-oriented) 프로그래밍이 필요하다.
목차
-
(1) 클래스와 객체
-
1) 클래스(class)와 객체(object)
2) 객체(object)와 인스턴스(instance)
(2) 클래스의 정의: class
-
1) 정의 방법
2) 메서드(method, 매소드)
3) 점(dot) 접근법
4) 생성자(Constructor)와 소멸자(Destructor)
5) self
6) 속성(property)
7) 변수(variable)
(3) 클래스의 상속(inheritance)
(4) 정적함수를 이용한 다중 생성
(1) 클래스와 객체
1) 클래스(class)와 객체(object)
- 과자 틀 → 클래스(class)
- 과자 틀에 의해서 만들어진 과자 → 객체(object)
(출처: 김종훈, 김동건, 파이썬 마스터, 한빛아카데미, 2025)
2) 객체(object)와 인스턴스(instance)
- 클래스(class)를 이용하여 생성된 객체(object)를 의미한다.
- 즉, 인스턴스는 클래스를 통해 정의된 속성(attribute)과 메서드(method)를 가진 객체를 의미한다.
- 예시:
내가 생각하는 월드 "클래스" 보디빌더 "인스턴스"들은 "이승철", "황철순" 등이 있다.
(2) 클래스의 정의: class
1) 정의 방법
방법 1)
- class 키워드를 이용해 클래스를 선언한다.
-
클래스로 객체를 생성한 후에 변수와 함수를 하나씩 추가한다.
(예시)
class Simple: # 클래스 Simple 정의
pass
# 객체 생성 후 멤버 변수 추가
a = Simple() # 클래스 Simple의 객체 a 생성
a.name = 'Jane' # 객체 a의 멤버변수 name 추가
a.phone = '123-456' # 객체 a의 멤버변수 phone 추가
방법 2)
- class 키워드를 이용해 클래스를 선언한다.
- 클래스에 변수와 함수를 한 번에 정의한다.
-
(예시)
class Account: numOfAccount = 0 # 클래스 변수 def __init__(self, name): # 생성자 함수 정의 self.name = name # 객체 변수 name self.balances = 0 # 객체 변수 balances Account.numOfAccount += 1 def withdraw(self, value): # withdraw 함수 정의 self.balances -= value return self.balances def deposit(self, value): # deposit 함수 정의 self.balances += value return self.balances def __del__(self): # 소멸자 함수 정의 Account.numOfAccount -= 1a1 = Account('John') # 클래스 Account의 객체 a1 생성 # 객체 a1의 변수 name에 John을 할당 a1.deposit(10) # 객체 a1의 함수 deposit를 사용하여 10을 적립: balances = 0 + 10 = 10 a1.withdraw(2) # 객체 a1의 함수 withdraw를 사용하여 2을 인출: balances = 10 - 2 = 8 print(a1.balances) # 출력: 8 a2 = Account('Jane') # 클래스 Account의 객체 a2 생성 # 객체 a1의 변수 name에 Jane을 할당 print('no of Account:', Account.numOfAccount) # 출력: 2
2) 메서드(method, 매소드)
- 클래스 내에서 정의되는 함수(function)이다.
- 기본함수가 아닌 사용자 정의 함수이다.
- 첫 번째 매개변수가
self이다.
3) 점(dot) 접근법
- 객체 지향 프로그래밍에서 객체(데이터)의 속성(변수)이나 메서드(함수)에 접근할 때 사용한다.
- 구조:
객체.속성 또는 객체.메서드() - 예시:
pandas데이터프레임에서df.columns는 데이터프레임의 컬럼을 가져오고,df.head()는 데이터프레임의 상위 5개 행을 보여준다.
4) 생성자(Constructor)와 소멸자(Destructor)
- 생성자(constructor) 메서드(함수): __init__
객체가 생성될 때 자동으로 호출되며, 인스턴스(객체) 변수의 초기화를 수행한다. def __init__(파라미터): 를 통해 작성한다. - 용어 - 생성자와 소멸자
5) self
- 클래스에서 self는 현재 인스턴스를 나타내는 첫 번째 매개변수로써, 관례적으로 사용되는 이름이다.
- 즉, 파이썬에서 클래스를 정의할 때 메서드의 첫 번째 매개변수는 반드시 self이어야 한다.
- 이는 해당 클래스의 인스턴스를 전달받아 해당 인스턴스의 속성이나 메서드에 접근할 수 있도록 하기 위함이다.
6) 속성(property)
- 멤버변수와 함수는 public 속성을 지닌다.
- 만약 private 속성으로 할 때는 두개의 밑줄 __로 시작한다.
7) 변수(variable)
(3) 클래스의 상속(inheritance)
- 상속(inheritance)이란
부모 클래스(parent class; super class)의 속성(property)과 함수(method)를
자녀 클래스(child class)가 그대로 물려 받는 개념이다.
(예시)
class Element: # 부모 클래스 Element의 선언
def __init__(self, id): # 생성자 함수
self.id = id
self.nodeIds = []
def computeStiffness(self): # 함수 생성
print('Element::computeStiffness')
def printElement(self): # 함수 생성
print(f'id : {self.id}')
class Q4Element(Element): # 부모 클래스 Element를 상속한 자녀 클래스 Q4Element의 선언
def __init__(self, id, nodeIds): # 생성자 함수
super().__init__(id) # 부모 클래스 생성자 호출
self.nodeIds = nodeIds
def computeStiffness(self):
print('Q4Element::computeStiffness')
# 자녀 클래스에서 부모 클래스의 생성자인 __init__()를 호출하는 방법은 다음 두 가지가 있다.
# 방법 1) super().__init__(id) 등과 같이 self를 사용하는 방법
# 방법 2) Element.__init__(self,id)와 같이 클래스 이름을 사용하고 함수에 self를 사용하는 방법
e = Q4Element(1, [1, 2, 3])
e.printElement() # 출력: id : 1
e.computeStiffness() # 출력: Q4Element::computeStiffness
(4) 정적함수를 이용한 다중 생성
-
함수에 self 인자가 없는 경우는 C의 static member와 동일하다.
-
이 함수에서는 클래스 멤버변수를 조작하거나 단순히 namespace를 사용하는 함수처럼 사용해야 한다.
(예시)
class Account:
numOfAccount = 0
@staticmethod
def makeZero(number):
Account.numOfAccount = number
- 파이썬 클래스는 keyword 입력을 허용하기 때문에 다중 생성자(multiple constructors)를 쓰기 쉽지 않다.
이를 위해
Ex1) variable(변동 가능한) 입력을 받든지,
Ex2) 정적함수를 이용하는 방법을 사용할 수 있다.
- 정적함수(static function)
함수의 실행이 클래스 외부 상태에 영향을 끼치지 않는 함수이다.
(예시 1)
class Rectangle:
def __init__(self, *args, **kwargs):
if len(args) == 2:
self.w, self.h = args
elif 'width' in kwargs and 'height' in kwargs:
self.w = kwargs['width']
self.h = kwargs['height']
else:
self.w = self.h = 0
(예시 2)
class Rectangle:
def __init__(self):
self.w = None
self.h = None
@staticmethod
def fromWidthHeight(w, h):
r = Rectangle()
r.w = w
r.h = h
return r
@staticmethod
def fromArea(w, area):
r = Rectangle()
r.w = w
r.h = area / w
return r
r1 = Rectangle.fromWidthHeight(4, 10)
r2 = Rectangle.fromArea(4, 10)